package com.itheima.filter;

import com.alibaba.fastjson.JSON;
import com.itheima.common.BaseContext;
import com.itheima.common.R;
import org.springframework.util.AntPathMatcher;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

// TODO 如何配置？？
@WebFilter(urlPatterns = "/*")
public class LoginFilter implements Filter {

    private AntPathMatcher antPathMatcher = new AntPathMatcher();

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {


        // 2、判断当前请求的资源要不要放行： 静态资源全部放 + 登录和退出 的都需要放行！！  放行后直接 retrurn;
        // 2.1 获取请求的uri地址
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        String uri = req.getRequestURI();
        // 2.2 配置需要放行的地址【静态资源全部放 + 登录和退出的】：
        String[] loginUrls = {
                "/employee/login",
                "/employee/logout",
                "/user/login",
                "/user/sendMsg",
                "/backend/**",
                "/front/**"};
        // 判断 uri地址 是否 匹配 loginUrls其中之一
        //  /backend/**   匹配   uri:   /backend/index.html
        for (String loginUrl : loginUrls) {
            boolean match = antPathMatcher.match(loginUrl, uri);
            if(match){//放行
                filterChain.doFilter(servletRequest,servletResponse);
                return;
            }
        }

        // 【后台登录的判断】3、不是登录相关的，判断是否登录，判断的依据是什么： session中是否有用户的id。
        Object employee = req.getSession().getAttribute("employee");
        // 有：则是已经登录，需要放行
        if(employee!=null){
            //将用户放入当前线程存储ThreadLocal中
            BaseContext.setCurrentId((Long) employee);
            filterChain.doFilter(servletRequest,servletResponse);
            return;
        }


        //【前台登录的判断】 3、不是登录相关的，判断是否登录，判断的依据是什么： session中是否有用户的id。
        Object user = req.getSession().getAttribute("user");
        // 有：则是已经登录，需要放行
        if(user!=null){
            BaseContext.setCurrentId((Long) user);
            filterChain.doFilter(servletRequest,servletResponse);
            return;
        }

        // 没有：则是非法访问，返回错误信息： JSON: {"data": null ,"code": 0 ,"msg": "NOTLOGIN"}
        R<Object> notlogin = R.error("NOTLOGIN");
        // 转成json: Fastjson ，响应给前端  response.getWriter();
        String result = JSON.toJSONString(notlogin);
        servletResponse.getWriter().write(result);
    }

    @Override
    public void destroy() {

    }
}
